package Ajedrez.Tablero;

import java.util.*;
import javax.swing.*;
import Ajedrez.Fichas.*;
import Ajedrez.visual.Tablero.Casilla;
import Ajedrez.visual.Tablero.TextAreas;

public class Seleccion
{
	static Map<String, ImageIcon> imageIcons;
	
	public static void inicializar(Ajedrez.visual.Tablero.Casilla[][] casillas)
	{
		imageIcons = new HashMap<String, ImageIcon>();
		imageIcons.put("PeonBlanco", new ImageIcon("resources/images/Piezas/PeonBlanco.png"));
		imageIcons.put("PeonNegro", new ImageIcon("resources/images/Piezas/PeonNegro.png"));
		
		imageIcons.put("TorreNegra", new ImageIcon("resources/images/Piezas/TorreNegra.png"));
		imageIcons.put("TorreBlanca", new ImageIcon("resources/images/Piezas/TorreBlanca.png"));
		
		imageIcons.put("CaballoNegro", new ImageIcon("resources/images/Piezas/CaballoNegro.png"));
		imageIcons.put("CaballoBlanco", new ImageIcon("resources/images/Piezas/CaballoBlanco.png"));
		
		imageIcons.put("AlfilNegro", new ImageIcon("resources/images/Piezas/AlfilNegro.png"));
		imageIcons.put("AlfilBlanco", new ImageIcon("resources/images/Piezas/AlfilBlanco.png"));
		
		imageIcons.put("ReyNegro", new ImageIcon("resources/images/Piezas/ReyNegro.png"));
		imageIcons.put("ReyBlanco", new ImageIcon("resources/images/Piezas/ReyBlanco.png"));
		
		imageIcons.put("ReinaNegra", new ImageIcon("resources/images/Piezas/ReinaNegra.png"));
		imageIcons.put("ReinaBlanca", new ImageIcon("resources/images/Piezas/ReinaBlanca.png"));
		
		casillas[0][0].setPieza(imageIcons.get("TorreNegra"));
		casillas[0][7].setPieza(imageIcons.get("TorreNegra"));
		casillas[7][0].setPieza(imageIcons.get("TorreBlanca"));
		casillas[7][7].setPieza(imageIcons.get("TorreBlanca"));
		
		casillas[0][1].setPieza(imageIcons.get("CaballoNegro"));
		casillas[0][6].setPieza(imageIcons.get("CaballoNegro"));
		casillas[7][1].setPieza(imageIcons.get("CaballoBlanco"));
		casillas[7][6].setPieza(imageIcons.get("CaballoBlanco"));
		
		casillas[0][2].setPieza(imageIcons.get("AlfilNegro"));
		casillas[0][5].setPieza(imageIcons.get("AlfilNegro"));
		casillas[7][2].setPieza(imageIcons.get("AlfilBlanco"));
		casillas[7][5].setPieza(imageIcons.get("AlfilBlanco"));
		
		casillas[0][4].setPieza(imageIcons.get("ReyNegro"));
		casillas[7][4].setPieza(imageIcons.get("ReyBlanco"));
		
		casillas[0][3].setPieza(imageIcons.get("ReinaNegra"));
		casillas[7][3].setPieza(imageIcons.get("ReinaBlanca"));
		
		for(int i = 0; i < 8; i++)
		{
			casillas[1][i].setPieza(imageIcons.get("PeonNegro"));
			casillas[6][i].setPieza(imageIcons.get("PeonBlanco"));
		}
	}
	
	public static void movimientos(Ajedrez.visual.Tablero.Casilla c, int[] a, Ajedrez.visual.Tablero.Casilla[][] casillas)
	{
		ImageIcon img = (ImageIcon)c.getPieza().getIcon();
		//Para el caballo y el rey no hace falta.
		if(tipo(img).getName().equals("Peon"))
		{
			if(colorPieza(img))
			{
				Peon p = (Peon)tipo(img);
				if(p.inicial && casillas[a[0] - 1][a[1]].pieza.getIcon() != null)
					casillas[a[0] - 2][a[1]].marcar(false);
				if(a[0] - 2 >= 0 && (ImageIcon)casillas[a[0] - 2][a[1]].pieza.getIcon() != null)
					casillas[a[0] - 2][a[1]].marcar(false);
			}
			else
			{
				Peon p = (Peon)tipo(img);
				if(p.inicial && casillas[a[0] + 1][a[1]].pieza.getIcon() != null)
					casillas[a[0] + 2][a[1]].marcar(false);
				if(a[0] + 2 <= 7 &&(ImageIcon)casillas[a[0] + 2][a[1]].pieza.getIcon() != null)
					casillas[a[0] + 2][a[1]].marcar(false);
			}
				
			//Hacer que el peon pueda comer.
			if(colorPieza(img))
			{
				if(a[0] - 1 >= 0 && a[1] - 1 >= 0 && !colorPieza((ImageIcon)casillas[a[0] - 1][a[1] - 1].pieza.getIcon()) && (ImageIcon)casillas[a[0] - 1][a[1] - 1].pieza.getIcon() != null)
					casillas[a[0] - 1][a[1] - 1].marcar(true);
				if(a[0] - 1 >= 0 && a[1] + 1 <= 7 && !colorPieza((ImageIcon)casillas[a[0] - 1][a[1] + 1].pieza.getIcon()) && (ImageIcon)casillas[a[0] - 1][a[1] + 1].pieza.getIcon() != null)
					casillas[a[0] - 1][a[1] + 1].marcar(true);
			}
			else
			{
				if(a[0] + 1 <= 7 && a[1] - 1 >= 0 && colorPieza((ImageIcon)casillas[a[0] + 1][a[1] - 1].pieza.getIcon()) && (ImageIcon)casillas[a[0] + 1][a[1] - 1].pieza.getIcon() != null)
					casillas[a[0] + 1][a[1] - 1].marcar(true);
				if(a[0] + 1 <= 7 && a[1] + 1 <= 7 && colorPieza((ImageIcon)casillas[a[0] + 1][a[1] + 1].pieza.getIcon()) && (ImageIcon)casillas[a[0] + 1][a[1] + 1].pieza.getIcon() != null)
					casillas[a[0] + 1][a[1] + 1].marcar(true);
			}
		}
		if(tipo(img).getName().equals("Torre") || tipo(img).getName().equals("Reina"))
		{
			//Restringir los movimiento de la torre y de la reina.
			int i = 1;
			while(a[0] - i >= 0)
			{
				if(casillas[a[0] - i][a[1]].pieza.getIcon() != null)
				{
					i++;
					while(a[0] - i >= 0)
					{
						casillas[a[0] - i][a[1]].marcar(false);
						i++;
					}
				}
				i++;
			}
			i = 1;
			while(a[0] + i <= 7)
			{
				if(casillas[a[0] + i][a[1]].pieza.getIcon() != null)
				{
					i++;
					while(a[0] + i <= 7)
					{
						casillas[a[0] + i][a[1]].marcar(false);
						i++;
					}
				}
				i++;
			}
			i = 1;
			while(a[1] + i <= 7)
			{
				if(casillas[a[0]][a[1] + i].pieza.getIcon() != null)
				{
					i++;
					while(a[1] + i <= 7)
					{
						casillas[a[0]][a[1] + i].marcar(false);
						i++;
					}
				}
				i++;
			}
			i = 1;
			while(a[1] - i >= 0)
			{
				if(casillas[a[0]][a[1] - i].pieza.getIcon() != null)
				{
					i++;
					while(a[1] - i >= 0)
					{
						casillas[a[0]][a[1] - i].marcar(false);
						i++;
					}
				}
				i++;
			}
		}
		if(tipo(img).getName().equals("Alfil") || tipo(img).getName().equals("Reina"))
		{
			//Restringir los movimientos del alfil y de la reina.
			int i = 1;
			while(a[0] - i >= 0 && a[1] - i >= 0)
			{
				if(casillas[a[0] - i][a[1] - i].pieza.getIcon() != null)
				{
					i++;
					while(a[0] - i >= 0 && a[1] - i >= 0)
					{
						casillas[a[0] - i][a[1] - i].marcar(false);
						i++;
					}
				}
				i++;
			}
			i = 1;
			while(a[0] - i >= 0 && a[1] + i <= 7)
			{
				if(casillas[a[0] - i][a[1] + i].pieza.getIcon() != null)
				{
					i++;
					while(a[0] - i >= 0 && a[1] + i <= 7)
					{
						casillas[a[0] - i][a[1] + i].marcar(false);
						i++;
					}
				}
				i++;
			}
			i = 1;
			while(a[0] + i <= 7 && a[1] - i >= 0)
			{
				if(casillas[a[0] + i][a[1] - i].pieza.getIcon() != null)
				{
					i++;
					while(a[0] + i <= 7 && a[1] - i >= 0)
					{
						casillas[a[0] + i][a[1] - i].marcar(false);
						i++;
					}
				}
				i++;
			}
			i = 1;
			while(a[0] + i <= 7 && a[1] + i <= 7)
			{
				if(casillas[a[0] + i][a[1] + i].pieza.getIcon() != null)
				{
					i++;
					while(a[0] + i <= 7 && a[1] + i <= 7)
					{
						casillas[a[0] + i][a[1] + i].marcar(false);
						i++;
					}
				}
				i++;
			}
		}
	}
	
	public static Pieza tipo(ImageIcon i)
	{
		if(i == imageIcons.get("TorreBlanca") || i == imageIcons.get("TorreNegra"))
			return new Torre();
		else
			if(i == imageIcons.get("PeonBlanco") || i == imageIcons.get("PeonNegro"))
				return new Peon();
			else
				if(i == imageIcons.get("CaballoBlanco") || i == imageIcons.get("CaballoNegro"))
					return new Caballo();
				else
					if(i == imageIcons.get("AlfilBlanco") || i == imageIcons.get("AlfilNegro"))
						return new Alfil();
					else
						if(i == imageIcons.get("ReyBlanco") || i == imageIcons.get("ReyNegro"))
							return new Rey();
						else
							if(i == imageIcons.get("ReinaBlanca") || i == imageIcons.get("ReinaNegra"))
								return new Reina();
							else
								return null;
	}
	
	public static boolean colorPieza(ImageIcon i)
	{
		if(i == imageIcons.get("TorreBlanca") || i == imageIcons.get("PeonBlanco") || i == imageIcons.get("ReinaBlanca") || i == imageIcons.get("ReyBlanco") || i == imageIcons.get("AlfilBlanco") || i == imageIcons.get("CaballoBlanco"))
			return true;
		else
			return false;
	}
	
	public static void marcar(boolean[][] b, Ajedrez.visual.Tablero.Casilla c, int[] a, Ajedrez.visual.Tablero.Casilla[][] casillas, int h, boolean turno)
	{
		for(int i = 0; i < h; i++)
		{
			for(int j = 0; j < h; j++)
			{
				if(b[i][j])
					if(casillas[i][j].pieza.getIcon() == null || turno != colorPieza((ImageIcon)casillas[i][j].pieza.getIcon()))
						casillas[i][j].marcar(true);
			}
		}
		Ajedrez.Tablero.Seleccion.movimientos(c, a, casillas);
	}
	
	public static int coordenada(int i)
	{
		switch(i)
		{
		case 0:
			i = 8;
			break;
		case 1:
			i = 7;
			break;
		case 2:
			i = 6;
			break;
		case 3:
			i = 5;
			break;
		case 4:
			i = 4;
			break;
		case 5:
			i = 3;
			break;
		case 6:
			i = 2;
			break;
		case 7:
			i = 1;
			break;
		}
		return i;
	}
	
	public static int[] coordenadas(Ajedrez.visual.Tablero.Casilla c, int h, Ajedrez.visual.Tablero.Casilla[][] casillas)
	{
		int x = 0;
		int y = 0;
		for(int i = 0; i < h; i++)
		{
			for(int j = 0; j < h; j++)
			{
				Ajedrez.visual.Tablero.Casilla cs = casillas[i][j];
				if(cs == c)
				{
					x = i;
					y = j;
					j = h+1;
					i = j;
				}
			}
		}
		int[] a = new int[2];
		a[0] = x;
		a[1] = y;
		return a;
	}
	
	public static void desmarcar(int h, Ajedrez.visual.Tablero.Casilla[][] casillas)
	{
		for(int i = 0; i < h; i++)
		{
			for(int j = 0; j < h; j++)
			{
				casillas[i][j].marcar(false);
			}
		}
	}
	
	public static Casilla buscar(Ajedrez.visual.Tablero.Casilla c, int h, Ajedrez.visual.Tablero.Casilla[][] casillas)
	{
		Ajedrez.visual.Tablero.Casilla cs = null;
		for(int i = 0; i < h; i++)
		{
			for(int j = 0; j < h; j++)
			{
				cs = casillas[i][j];
				if(cs == c)
				{
					j = h+1;
					i = j;
				}
			}
		}
		return cs;
	}
	
	private static char letra(int i)
	{
		char c = '0';
		switch(i)
		{
		case 0:
			c = 'A';
			break;
		case 1:
			c = 'B';
			break;
		case 2:
			c = 'C';
			break;
		case 3:
			c = 'D';
			break;
		case 4:
			c = 'E';
			break;
		case 5:
			c = 'F';
			break;
		case 6:
			c = 'G';
			break;
		case 7:
			c = 'H';
			break;
		}
		return c;
	}
	
	public static String escribir(Ajedrez.visual.Tablero.Casilla c1, Ajedrez.visual.Tablero.Casilla c2, boolean comer, int h, Ajedrez.visual.Tablero.Casilla[][] casillas)
	{
		String s = "";
		if(comer)
		{
			if(tipo((ImageIcon)c1.pieza.getIcon()).getName().equals("Rey"))
				s = "K";
			else
				if(tipo((ImageIcon)c1.pieza.getIcon()).getName().equals("Reina"))
					s = "Q";
				else
					if(tipo((ImageIcon)c1.pieza.getIcon()).getName().equals("Torre"))
						s = "R";
					else
						if(tipo((ImageIcon)c1.pieza.getIcon()).getName().equals("Alfil"))
							s = "B";
						else
							if(tipo((ImageIcon)c1.pieza.getIcon()).getName().equals("Caballo"))
								s = "N";
		}
		s = s + letra(coordenadas(c1, h, casillas)[1]) + coordenada(coordenadas(c1, h, casillas)[0]);
		if(comer)
			s = s + "x";
		else
			s = s + "-";
		s = s + letra(coordenadas(c2, h, casillas)[1]) + coordenada(coordenadas(c2, h, casillas)[0]);
		return s;
	}
	
	public static void anyadirCaptura(Pieza p, int[][] a, boolean b)
	{
		if(p.getName().equals("Peon"))
			if(b)
				a[0][0]++;
			else
				a[0][1]++;
		else
		{
			if(p.getName().equals("Alfil"))
				if(b)
					a[1][0]++;
				else
					a[1][1]++;
			else
			{
				if(p.getName().equals("Caballo"))
					if(b)
						a[2][0]++;
					else
						a[2][1]++;
				else
				{
					if(p.getName().equals("Torre"))
						if(b)
							a[3][0]++;
						else
							a[3][1]++;
					else
					{
						if(p.getName().equals("Reina"))
							if(b)
								a[4][0]++;
							else
								a[4][1]++;
					}
				}
			}
		}
		TextAreas.anyadirCaptura(a, b);
	}
}
